package com.sk89q.commandbook.util.entity;
import org.bukkit.Location;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Fireball;
import org.bukkit.entity.Projectile;
import org.bukkit.util.Vector;
import java.util.HashSet;
import java.util.Set;
public class ProjectileUtil {
/**
* Send a projectile from an entity's eye level.
*
* @param loc
* @param dir
* @param speed
*/
public static <T extends Projectile> T sendProjectileFromLocation(Location loc, Vector dir, float speed, Class<T> clazz) {
loc = loc.clone();
Vector actualDir = dir.clone().normalize();
Vector finalVecLoc = loc.toVector().add(actualDir.multiply(2));
loc.setX(finalVecLoc.getX());
loc.setY(finalVecLoc.getY());
loc.setZ(finalVecLoc.getZ());
T projectile = loc.getWorld().spawn(loc, clazz);
if (projectile instanceof Fireball) {
((Fireball) projectile).setDirection(dir.multiply(speed));
} else {
projectile.setVelocity(dir.multiply(speed));
}
return projectile;
}
/**
* Send projectiles from an entity's eye level.
*
* @param loc
* @param amt number of fireballs to shoot (evenly spaced)
*/
public static <T extends Projectile> Set<T> sendProjectilesFromLocation(Location loc, int amt, float speed, Class<T> clazz) {
final double tau = 2 * Math.PI;
double arc = tau / amt;
Set<T> resultSet = new HashSet<T>();
for (double a = 0; a < tau; a += arc) {
resultSet.add(sendProjectileFromLocation(loc, new Vector(Math.cos(a), 0, Math.sin(a)), speed, clazz));
}
return resultSet;
}
}